package com.yifeng.service.impl;

import com.yifeng.common.HtmlUtil;
import com.yifeng.common.Result;
import com.yifeng.dao.NewsDao;
import com.yifeng.factory.DAOFactory;
import com.yifeng.model.News;
import com.yifeng.service.NewsService;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;


public class NewsServiceImpl implements NewsService {

    /*
    负责人：未知

    功能：新闻数据访问对象实例，用于执行数据库操作

    参数：无

    返回值：无
    */
    private final NewsDao newsDao = DAOFactory.getNewsDao();

    /*
    负责人：xiaoq

    功能：查询类型为"媒体报道"和"项目新闻"的新闻列表，用于前台特定栏目展示

    参数：无

    返回值：包含两类新闻的Result封装对象
    */
    @Override
    public Result getMediaAndProjectNews() {
        try{
            //查询媒体报道和项目新闻
            List<String> types= Arrays.asList("媒体报道","项目新闻");
            List<News> newsList=newsDao.findByTypes(types);
            return Result.success(newsList);
        } catch (Exception e){
            e.printStackTrace();
            return Result.fail("获取媒体报道和项目新闻失败");
        }
    }

    /*
    负责人：xiaoq

    功能：查询包含图片的新闻列表，用于前台图片新闻展示

    参数：无

    返回值：包含含图片新闻的Result封装对象
    */
    @Override
    public Result getNewsWithImages() {
        try{
            List<News> newsList=newsDao.findWithImages();
            return Result.success(newsList);
        } catch (Exception e){
            e.printStackTrace();
            return Result.fail("获取图片新闻失败");
        }
    }


    /*
    负责人：xiaoq

    功能：根据关键词搜索新闻，支持标题和内容的模糊匹配

    参数：keyword - 搜索关键词

    返回值：匹配的新闻列表Result封装对象
    */
    @Override
    public Result searchNews(String keyword) {
        try{
            List<News> newsList=newsDao.searchByKeyword(keyword);
            return Result.success(newsList);
        } catch (Exception e){
            e.printStackTrace();
            return Result.fail("搜素新闻失败");
        }
    }

    /*
    负责人：xiaoq

    功能：分页查询新闻列表，用于前台新闻列表页展示

    参数：pageNum - 页码, pageSize - 每页条数

    返回值：分页后的新闻列表Result封装对象
    1*/
    @Override
    public Result getNewsListWithPagination(int pageNum, int pageSize) {
        try{
            int offset = (pageNum-1)*pageSize;
            List<News> newsList=newsDao.findPaginated(offset, pageSize);
            return Result.success(newsList);
        } catch (Exception e){
            e.printStackTrace();
            return Result.fail("获取新闻列表失败");
        }
    }

    /*
    负责人：xiaoq

    功能：根据新闻ID查询新闻详情，仅限已发布状态的新闻

    参数：newsId - 新闻唯一标识

    返回值：新闻详情Result封装对象
    1*/
    @Override
    public Result getNewsDetailById(int newsId) {
        try{
            News news=newsDao.findById(newsId);
            if(news==null){
                return Result.fail(406,"新闻不存在");
            }
            return Result.success(news);
        } catch (Exception e){
            e.printStackTrace();
            return Result.fail(406,"获取新闻详情失败");
        }

    }

    /*
    负责人：xiaoq

    功能：分页获取所有新闻，用于后台新闻管理系统

    参数：pageNum - 页码, pageSize - 每页条数

    返回值：分页新闻列表Result封装对象
    1*/
    @Override
    public Result getAllNewsWithPagination(int pageNum, int pageSize) {
        try {
            int offset = (pageNum - 1) * pageSize;
            List<News> newsList = newsDao.findAllPaginated(offset, pageSize);
            return Result.success(newsList);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.fail(406,"获取新闻列表失败");
        }
    }

    /*
    负责人：xiaoq

    功能：按状态分页查询新闻，用于后台按状态筛选管理

    参数：status - 新闻状态, pageNum - 页码, pageSize - 每页条数

    返回值：筛选后的新闻列表Result封装对象
    */
    @Override
    public Result getNewsByStatusWithPagination(int status, int pageNum, int pageSize) {
        try{
            int offset = (pageNum - 1) * pageSize;
            List<News> newsList=newsDao.findByStatusPaginated(status, offset, pageSize);
            return Result.success(newsList);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.fail(406,"按状态获取新闻失败");
        }

    }

    /*
    负责人：xiaoq

    功能：根据新闻ID获取单条新闻详情，用于后台新闻编辑

    参数：newsId - 新闻ID

    返回值：新闻详情Result封装对象
    1*/
    @Override
    public Result getNewsById(Integer newsId) {
        try{
            News news=newsDao.findById(newsId);
            if(news==null){
                return Result.fail(406,"新闻不存在");
            }
            return Result.success(news);
        } catch (Exception e){
            e.printStackTrace();
            return Result.fail(406,"新闻不存在");
        }
    }

    /*
    负责人：xiaoq

    功能：新增一条新闻，用于后台新闻发布，包含数据校验和安全过滤

    参数：news - 包含新闻信息的News对象

    返回值：操作结果Result封装对象
    */
    @Override
    public Result createNews(News news) {
        try{
            //判断是否成功插入标志flag
            boolean flag=newsDao.insert(news);
            if(flag){
                return Result.success();
            } else{
                return Result.fail(406,"新闻添加失败");
            }

        } catch (Exception e){
            e.printStackTrace();
            return Result.fail(406,"新闻添加失败");
        }
    }

    /*
    负责人：xiaoq

    功能：更新一条新闻，用于后台新闻编辑保存，包含完整的数据校验和业务逻辑

    参数：news - 包含更新后新闻信息的News对象

    返回值：操作结果Result封装对象
    */
    @Override
    public Result updateNews(News news) {
        try{
            //判断成功更新标志flag
            boolean flag=newsDao.update(news);
            if(flag){
                return Result.success();
            } else {
                return Result.fail(406,"新闻更新失败");
            }
        } catch (Exception e){
            e.printStackTrace();
            return Result.fail(406,"新闻更新失败");
        }
    }

    /*
    负责人：xiaoq

    功能：删除指定新闻，实现后台新闻删除功能，包含存在性验证

    参数：newsId - 新闻ID

    返回值：操作结果Result封装对象
    */
    @Override
    public Result deleteNewsById(Integer newsId) {
        try{
            boolean flag=newsDao.deleteById(newsId);
            if(flag){
                return Result.success();
            } else {
                return Result.fail(406,"新闻删除失败");
            }
        } catch (Exception e){
            e.printStackTrace();
            return Result.fail(406,"新闻删除失败");
        }
    }


    //不分页查找新闻

    @Override
    public Result getAllNews() {
        try{
            List<News> newsList=newsDao.findAll();
            if(newsList==null){
                return Result.fail(406,"新闻列表为空");
            }
            return Result.success(newsList);
        } catch (Exception e){
            e.printStackTrace();
            return Result.fail(406,"获取新闻列表失败");
        }
    }

    @Override
    public Result getNewsByStatus(int status) {
        try{
            List<News> newsList=newsDao.findByStatus(status);
            if(newsList==null){
                return Result.fail(406,"新闻列表为空");
            }
            return Result.success(newsList);
        } catch (Exception e){
            e.printStackTrace();
            return Result.fail(406,"获取新闻列表失败");
        }
    }
}